﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Entities;
using Model;

namespace BLL
{
    public class TarefaBll
    {
        public static readonly Container db = new Container();

        /// <summary>
        /// Faz uma pesquisa e retorna o ultimo valor do Codigo por usuário
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="usuario">String</param>
        /// <returns>Int</returns>
        public static int GetUltimoCodigo(string usuario)
        {
            if (db.Tarefa.FirstOrDefault(f => f.Pessoa.Usuario == usuario) != null)
            {
                return db.Tarefa.Where(w => w.Pessoa.Usuario == usuario).Max(m => m.Codigo);
            }
            else
            {
                return 1;
            }
        }

        /// <summary>
        /// Faz uma pesquisa e retorna o ultimo valor do Codigo por id da Pessoa
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="id">Int</param>
        /// <returns>Int</returns>
        public static int GetUltimoCodigo(int id)
        {
            if (db.Tarefa.FirstOrDefault(f => f.PessoaId == id) != null)
            {
                return db.Tarefa.Where(w => w.PessoaId == id).Max(m => m.Codigo) + 1;
            }
            else
            {
                return 1;
            }
        }

        /// <summary>
        /// Retorna o id da Tarefa de acordo com o código de referência da conta e o usuário
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="codigoReferencia">Int</param>
        /// <param name="usuario">String</param>
        /// <returns>Int</returns>
        public static int GetId(int codigoReferencia, string usuario)
        {
            return db.Tarefa.Where(w => w.Pessoa.Usuario == usuario && w.Conta.CodigoReferencia == codigoReferencia).Select(s => s.Id).FirstOrDefault();
        }

        /// <summary>
        /// Faz uma pesquisa e retorna a Tarefa de acordo com o código da Tarefa com o nome de usuário
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="id">Int</param>
        /// <param name="usuario">String</param>
        /// <returns>Tarefa</returns>
        public static Tarefa GetTarefa(int id, string usuario)
        {
            return db.Tarefa.FirstOrDefault(f => f.Codigo == id && f.Pessoa.Usuario == usuario);
        }

        /// <summary>
        /// Faz uma pesquisa e retorna a Tarefa de acordo com o código de referência da Conta e com o nome de usuário
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="codigoreferencia">Int</param>
        /// <param name="usuario">String</param>
        /// <returns>Tarefa</returns>
        public static Tarefa GetTarefaPorConta(int codigoReferencia, string usuario)
        {
            return db.Tarefa.FirstOrDefault(f => f.Conta.CodigoReferencia == codigoReferencia && f.Pessoa.Usuario == usuario);
        }

        /// <summary>
        /// Retorna uma lista de Tarefas por id de usuário (Pessoa.Id)
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="idPessoa">Int</param>
        /// <returns>Lista de Tarefas</returns>
        public static List<Tarefa> GetLista(int idPessoa)
        {
            return db.Tarefa.Where(w => w.PessoaId == idPessoa).ToList();
        }

        /// <summary>
        /// Retorna uma lista de Tarefas por id de usuário (Pessoa.Id) e por mês de cadastro/tarefa. Use cadastro == true para mês de cadastro ou cadastro == false para mês da tarefa.
        /// Use mes == 0 para trazer independente do mês
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="idPessoa">Int</param>
        /// <param name="mes">Int</param>
        /// <param name="ano">Int</param>
        /// <param name="cadastro">Boolean</param>
        /// <returns>Lista de Tarefas</returns>
        public static List<Tarefa> GetLista(int idPessoa, int mes, int ano, bool cadastro)
        {
            if (mes == 0 && cadastro) return db.Tarefa.Where(w => w.PessoaId == idPessoa && w.DataCadastro.Year == ano).ToList();
			else if (mes == 0) return db.Tarefa.Where(w => w.PessoaId == idPessoa && w.DataTarefa.Year == ano).ToList();
            else if (cadastro) return db.Tarefa.Where(w => w.PessoaId == idPessoa && w.DataCadastro.Month == mes && w.DataCadastro.Year == ano).ToList();
            else return db.Tarefa.Where(w => w.PessoaId == idPessoa && w.DataTarefa.Month == mes && w.DataTarefa.Year == ano).ToList();
        }

        /// <summary>
        /// Retorna uma lista de Tarefas por nome de usuário (Pessoa.Usuario ou User.Identity.Name)
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="usuario">String</param>
        /// <returns>Lista de Tarefas</returns>
        public static List<Tarefa> GetLista(string usuario)
        {
            return db.Tarefa.Where(w => w.Pessoa.Usuario == usuario).ToList();
        }

        /// <summary>
        /// Retorna uma lista de Tarefas por nome de usuário (Pessoa.Usuario ou User.Identity.Name) e por mês de cadastro/tarefa. Use cadastro == true para mês de cadastro ou cadastro == false para mês de tarefa.
        /// Use mes == 0 para trazer independente do mês
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="usuario">String</param>
        /// <param name="mes">Int</param>
        /// <param name="ano">Int</param>
        /// <param name="cadastro">Boolean</param>
        /// <returns>Lista de Tarefas</returns>
        public static List<Tarefa> GetLista(string usuario, int mes, int ano, bool cadastro)
        {
			if (mes == 0 && cadastro) return db.Tarefa.Where(w => w.Pessoa.Usuario == usuario && w.DataCadastro.Year == ano).ToList();
			else if (mes == 0) return db.Tarefa.Where(w => w.Pessoa.Usuario == usuario && w.DataTarefa.Year == ano).ToList();
            else if (cadastro) return db.Tarefa.Where(w => w.Pessoa.Usuario == usuario && w.DataCadastro.Month == mes && w.DataCadastro.Year == ano).ToList();
            else return db.Tarefa.Where(w => w.Pessoa.Usuario == usuario && w.DataTarefa.Month == mes && w.DataTarefa.Year == ano).ToList();
        }

        /// <summary>
        /// Grava a Tarefa no banco de dados
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="p">Tarefa</param>
        /// <returns>Boolean</returns>
        public static bool Add(Tarefa t)
        {
            try
            {
                db.Tarefa.AddObject(t);
                db.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Altera a Tarefa no banco de dados
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="p">Tarefa</param>
        /// <returns>Boolean</returns>
        public static bool Edit(Tarefa t)
        {
            try
            {
                db.Tarefa.ApplyCurrentValues(t);
                db.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Exclui uma Tarefa do banco de dados
        /// </summary>
        /// <param name="db">Container</param>
        /// <param name="p">Tarefa</param>
        /// <returns>Boolean</returns>
        public static bool Delete(int id)
        {
            try
            {
                var t = db.Tarefa.FirstOrDefault(f => f.Id == id);
                db.Tarefa.DeleteObject(t);
                db.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}